package test.demo;

/***
 ** @category 单例模式-懒汉式(线程安全，同步方法)
 ** @author qing.yunhui
 ** @email: qingyh@glodon.com
 ** @createTime: 2021-12-30 16:17
 **/
public class SingletonTest04 {
    public static void main(String[] args) {
        System.out.println("懒汉式2 ， 线程安全~");
        Singleton04 instance = Singleton04.getInstance();
        Singleton04 instance2 = Singleton04.getInstance();
        System.out.println(instance == instance2); // true
        System.out.println("instance.hashCode=" + instance.hashCode());
        System.out.println("instance2.hashCode=" + instance2.hashCode());
		/*优缺点说明：
		1) 解决了线程安全问题
		2) 效率太低了，每个线程在想获得类的实例时候，执行 getInstance()方法都要进行同步。而其实这个方法只执行
		一次实例化代码就够了，后面的想获得该类实例，直接 return 就行了。方法进行同步效率太低
		3) 结论：在实际开发中，不推荐使用这种方式*/
    }
}
// 懒汉式(线程安全，同步方法)
class Singleton04 {
    private static Singleton04 instance;
    private Singleton04() {}
    //提供一个静态的公有方法，加入同步处理的代码，解决线程安全问题
    public static synchronized Singleton04 getInstance() {
        if(instance == null) {
            instance = new Singleton04();
        }
        return instance;
    }
}